package com.company.JUC.AQS.CyclicBarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Classname MyCircularQueue
 * @Description TODO  学习cyclicBarrier   循环栅栏 比countdownlatch更强大
 * 所有线程都到达了指定的临界点（barrier）时候，才能继续往下执行，否则，则会阻塞等待在调用await()处
 * @Date 2021/8/18 17:17
 * @Created by ylr
 */
public class Main {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(6, () -> {
            System.out.println(" 所有线程准备完毕,所有线程开始运行!");
        });
        System.out.println("开始集结线程!");
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    System.out.println("线程 "+Thread.currentThread().getName()+"准备完毕!");
                    // 另一个参数超时限制，阻塞等待直至到达超时时间为止
                    //等到所有的线程都到达指定的临界点
                    cyclicBarrier.await();

                    System.out.println("线程 "+Thread.currentThread().getName()+"出发!");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }


    }

}
